/*
 Guardado de variables globales/permanentes
 mem( nombre, X ). --> No
 mem( nombre, ariel ). --> Yes
 mem( nombre, X ). --> X=ariel
 mem( nombre, juan ). --> Yes
 mem( nombre, X ). --> X=juan
 
 mem( [apellido, edad], [gonzales,34] ).
 mem( [apellido, edad], [Ap,Edad] ) --> Ap=gonzales,Edad=34
 
 mem( [dir/callao, altura/1200] ).
 mem( [dir/Dir, altura/Alt] ). --> Dir=callao, Alt=1200
*/

% Descalifica un mal llamado
mem( Key, _ ) :- var(Key), !, fail.

% get con un key
mem( Key, Value ) :- 
	atomic(Key),
	var(Value), 
	recorded( Key, Value ),
	nonvar( Value ).

% set con key y value
mem( Key, Value ) :- 
	atomic(Key),
	nonvar( Value ),
	mem_del( Key ),
	recorda( Key, Value ).
	
% get/set usando 2 listas
mem( [], [] ).
mem( [A|R], [B|S] ) :- mem( A, B ), mem( R, S ).

% get/set usando 1 lista doble
mem( [] ).
mem( [A/B|R] ) :- mem(A, B), mem(R).

mem_has( Key ) :- mem_ref( Key, _ ).
	
mem_ref( Key, Ref ) :-
	recorded( Key, _, Ref ),
	nonvar(Ref).

mem_del( Key ) :-
	mem_ref( Key, Ref ),
	erase(Ref).
mem_del( _ ).